"""
面向对象：封装 继承 多台
继承 实现代码重用
--单继承
--多继承

"""


"""
继承的语法
class 类名(父类名):
    语句

子类继承自父类，可以享受父类中已经封装好的方法，不需要再次开发
子类中应该根据需求，封装子类特有的属性和方法

"""

# class Animal:
#     def eat(self):
#         print("eat")
#     def run(self):
#         print("run")
#
# dog1 = Animal()
# dog1.eat()
# dog1.run()
# print(dog1)
#
# # Dog子类从Animal父类继承所有的方法和属性
# class Dog(Animal):
#     def sleep(self):
#         print("sleep")
#
# dog2 = Dog()
# dog2.eat()
# dog2.run()
# dog2.sleep()
# print(dog2)

#dog1与dog2内存地址不同

"""
专业术语
Dog类是Animal类的子类，Animal是Dog的父类，Dog从Animal继承
Dog是Animal的派生类，Animal是dog的基类，Dog从Animal派生
派生就是继承，基类就是父类
"""


"""
继承的传递性
子类拥有父类以及父类的父类中封装的属性和方法

没有继承关系的类不能相互调用类中的方法或属性

如果c继承于a，b也继承于a
b和c类中的属性和方法不能相互调用
"""


"""
方法的重写
当父类的方法实现不能满足子类需求时，对方法进行重写

重写父类方法的两种情况：
-覆盖父类方法
-扩展父类方法

使用方法:在子类中定义一个与父类同名的方法，并且实现
在运行时，只会调用子类中重写的方法，不会调用父类的封装方法

"""

# class a:
#     def d(self):
#         print("d")
#     def e(self):
#         print("e")
#
# class b(a):
#     def e(self):
#         print("重写e方法")
#
# aaa = a()
# aaa.d()
# aaa.e()
#
# bbb = b()
# bbb.d()
# bbb.e()

"""
对父类方法进行扩展
如果子类中的方法实现包含父类的方法实现，则使用扩展的方式
    （父类原本封装的方法实现，是子类方法中的一部分）
1.在子类中重写父类方法
2.在需要的位置使用super().父类方法来调用父类方法的执行
3.代码其他的位置针对子类的需求，编写子类特有的代码实现

super()
super是一个特殊的类，super()是使用super类创建出来的对象
最常使用的场景就是在重写父类方法时调用在父类中封装的方法

"""


# class a:
#     def d(self):
#         print("d")
#     def e(self):
#         print("a类中的e方法")
#
# class b(a):
#     def e(self):
#         print("重写e方法")
#
# class c(a):
#     def e(self):
#         #扩展e方法
#         #1.根据子类特有的需求编写
#         print("扩展的e方法")
#         #2.保留父类封装好的方法，使用super()
#         super().e()
#         #3.增加子类的其他代码
#     def f(self):
#         print("c子类中特有的方法")
#
# ccc = c()
# ccc.e()
# ccc.f()


"""
使用父类名调用父类方法
python2中使用，3中不推荐
"""

